package cn.always.xiajia.framework.security.core.service.impl;

import java.util.Arrays;

import cn.always.xiajia.admin.client.api.sys.SysMenuApi;
import cn.always.xiajia.framework.common.util.ExtCollUtil;
import cn.always.xiajia.framework.security.core.entity.LoginUser;
import cn.always.xiajia.framework.security.core.service.SecurityFrameworkService;
import cn.always.xiajia.framework.security.core.util.SecurityFrameworkUtils;
import lombok.RequiredArgsConstructor;

/**
 * 默认的 {@link SecurityFrameworkService} 实现类
 *
 * @author 芋道源码
 */
@RequiredArgsConstructor
public class SecurityFrameworkServiceImpl implements SecurityFrameworkService {

	protected final SysMenuApi sysMenuApi;

	/**
	 * 判断是否有权限
	 *
	 * @param permission 权限
	 * @return 是否
	 */
	@Override
	public boolean hasPermission(String permission) {
		return hasAnyPermissions(permission);
	}

	/**
	 * 判断是否有权限，任一一个即可
	 *
	 * @param permissions 权限
	 * @return 是否
	 */
	@Override
	public boolean hasAnyPermissions(String... permissions) {
		return sysMenuApi.hasAnyPermissions(SecurityFrameworkUtils.getLoginUserId(), permissions);
	}

	/**
	 * 判断是否有角色
	 *
	 * 注意，角色使用的是 SysRoleDO 的 code 标识
	 *
	 * @param role 角色
	 * @return 是否
	 */
	@Override
	public boolean hasRole(String role) {
		return hasAnyRoles(role);
	}

	/**
	 * 判断是否有角色，任一一个即可
	 *
	 * @param roles 角色数组
	 * @return 是否
	 */
	@Override
	public boolean hasAnyRoles(String... roles) {
		return sysMenuApi.hasAnyRoles(SecurityFrameworkUtils.getLoginUserId(), roles);
	}

	/**
	 * 判断是否有授权
	 *
	 * @param scope 授权
	 * @return 是否
	 */
	@Override
	public boolean hasScope(String scope) {
		return hasAnyScopes(scope);
	}

	/**
	 * 判断是否有授权范围，任一一个即可
	 *
	 * @param scope 授权范围数组
	 * @return 是否
	 */
	@Override
	public boolean hasAnyScopes(String... scope) {
		LoginUser user = SecurityFrameworkUtils.getLoginUser();
		if (user == null) {
			return false;
		}
		return ExtCollUtil.containsAny(user.getScopes(), Arrays.asList(scope));
	}

}
